"""
面向对象包括2大主要特性:
1 封装
2 继承
3 多态
"""
"""
这里我们介绍  类继承 的复写父类成员 和 调用父类成员

复写
子类继承父类的成员属性和成员方法后,如果对其"不满意",那么可以进行复写
即: 在子类中重新定义同名的属性或方法即可
"""


# 这个是父类
class 类_基础手机:
    序列号 = None
    厂商 = "华为2230"

    def 通信(self):  # 类方法里 self 关键字必须写
        print("父类,正在使用4G通信")

# ----------------------------------------------------------------


# 定义子类
class 类_新手机(类_基础手机):  # 继承父类的全部内容
    厂商 = "小蜜4483"    # 复写 "厂商" 成员变量信息,  相当于把父类里同名的变量覆盖掉

    def 通信(self):     # 复写成员方法  和上面成员变量是一样,和父类里的同名
        print("子类,正在使用5G通信")


# 定义对象
手机1 = 类_新手机()  # 括号一定要加,虽然不加不会报错
print(手机1.厂商)  # 子类里复写 "厂商" 变量,输出的是子类的信息
手机1.通信()       # 同样 子类里复写 "通信()" 方法,输出的是子类的信息
print()

"""
调用父类同名成员
一旦复写父类成员,那么类对象调用成员的时候,就会调用复写后的新成员
如果需要使用被复写的父类成员,需要特殊的调用方法

方式1:
调用父类成员
使用成员变量:  父类名.成员变量
使用成员方法:  父类名.成员方法(self)  

方式2:
使用super()调用父类成员
使用成员变量:  super().成员变量
使用成员方法:  super().成员方法()

"""


# 在定义子类
class 类_手机2023版(类_基础手机):  # 继承父类的全部内容
    厂商 = "小蜜4483"    # 复写 父类成员变量

    def 通信(self):     # 复写 父类成员方法
        # 方式1 调用父类成员变量和方法
        print(f"父类的厂商是: {类_基础手机.厂商}")
        类_基础手机.通信(self)
        # 方式2
        print(f"父类的厂商是: {super().厂商}")
        super().通信()

        print("子类,正在使用5G通信")


# 定义对象
手机2 = 类_手机2023版()  # 括号一定要加
手机2.通信()  # 调用了父类的 变量 和方法
